/*
 * Created: 2022-08-18 21:41:48
 * Author : 涛涛涛
 */
/** 调整颜色 */
export class AdjustColor {
    //hex颜色转rgb颜色
    private static HexToRgb(str) {
        var r = /^\#?[0-9A-F]{6}$/;
        //test方法检查在字符串中是否存在一个模式，如果存在则返回true，否则返回false
        if (!r.test(str)) return window.alert('输入错误的hex');
        //replace替换查找的到的字符串
        str = str.replace('#', '');
        //match得到查询数组
        var hxs = str.match(/../g);
        //alert('bf:'+hxs)
        for (var i = 0; i < 3; i++) hxs[i] = parseInt(hxs[i], 16);
        //alert(parseInt(80, 16))
        //console.log(hxs);
        return hxs;
    }

    //GRB颜色转Hex颜色
    private static RgbToHex(a, b, c) {
        var r = /^\d{1,3}$/;
        if (!r.test(a) || !r.test(b) || !r.test(c)) return window.alert('输入错误的rgb颜色值');
        var hexs = [a.toString(16), b.toString(16), c.toString(16)];
        for (var i = 0; i < 3; i++) if (hexs[i].length == 1) hexs[i] = '0' + hexs[i];
        return '#' + hexs.join('');
    }

    /** 判断颜色值是否可用,并校正颜色值大小写 */
    private static correctColorText(color: string) {
        color = color.toLocaleUpperCase();
        if (/^\#?[0-9A-F]{3}$/.test(color)) {
            const colorStrArr = color.split('');
            color = colorStrArr.reduce((pre, cur) => {
                if (cur === '#') return pre + cur;
                else return pre + cur + cur;
            }, '');
            return color;
        } else if (/^\#?[0-9A-F]{6}$/.test(color)) {
            return color;
        } else {
            window.alert('输入错误的hex颜色值');
            throw new Error('输入错误的hex颜色值');
        }
    }

    /**
     * 加深颜色
     * @param color 颜色
     * @param level 加深的值 0-1 之间
     * @returns
     */
    public static darken(color: string, level: number) {
        color = AdjustColor.correctColorText(color);
        var rgbc = AdjustColor.HexToRgb(color);
        //floor 向下取整
        for (var i = 0; i < 3; i++) rgbc[i] = Math.floor(rgbc[i] * (1 - level));
        return AdjustColor.RgbToHex(rgbc[0], rgbc[1], rgbc[2]);
    }

    /**
     * 减淡颜色
     * @param color 颜色
     * @param level 减淡值  0-1 之间
     * @returns
     */
    public static lighten(color, level) {
        color = AdjustColor.correctColorText(color);
        var rgbc = AdjustColor.HexToRgb(color);
        //floor 向下取整
        for (var i = 0; i < 3; i++) rgbc[i] = Math.floor((255 - rgbc[i]) * level + rgbc[i]);
        return AdjustColor.RgbToHex(rgbc[0], rgbc[1], rgbc[2]);
    }
}
